package org.dev.`as`.project.common.ui.component

import android.os.Bundle
import android.telecom.Call
import android.view.View
import androidx.annotation.CallSuper
import androidx.core.widget.ContentLoadingProgressBar
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.fragment_list.*
import kotlinx.android.synthetic.main.layout_content_loading_view.*
import org.dev.`as`.project.common.R
import org.dev.hi.hiui.empty.EmptyView
import org.dev.hi.hiui.item.HiAdapter
import org.dev.hi.hiui.item.HiDataItem
import org.dev.hi.hiui.recyclerview.HiRecyclerView
import org.dev.hi.hiui.refresh.*

/**
 * Author WenPing
 * CreateTime 2021/5/27.
 * Description:
 * 支持下拉刷新的列表fragment
 */
abstract class HiAbsListFragment : HiBaseFragment(), HiRefreshListener {

    // 分页下来
    open var pageIndex: Int = 0

    private lateinit var hiAdapter: HiAdapter

    private lateinit var layoutManager: RecyclerView.LayoutManager

    // loading控件
    private var loadingView: ContentLoadingProgressBar? = null

    private var emptyView: EmptyView? = null

    private var recyclerView: HiRecyclerView? = null

    private var refreshLayout: HiRefreshLayout? = null


    companion object {
        // 预加载数据数量
        const val PREFETCH_SIZE = 5
    }

    private lateinit var refreshHeaderView: HiTextOverView


    override fun getLayoutId(): Int = R.layout.fragment_list

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        this.refreshLayout = refresh_layout

        this.recyclerView = recycler_view

        this.emptyView = empty_view

        this.loadingView = content_loading

        refreshHeaderView = HiTextOverView(context!!)
        refreshLayout?.setRefreshOverView(refreshHeaderView)
        refreshLayout?.setRefreshListener(this)

        layoutManager = createLayoutManager()

        hiAdapter = HiAdapter(context!!)

        /**
         * 修复 layoutManager为null的问题
         */
        recyclerView?.let {
            recyclerView!!.layoutManager = layoutManager
            recyclerView!!.adapter = hiAdapter
        }

        emptyView?.visibility = View.GONE

        emptyView?.run {
            visibility = View.GONE
            setIcon(R.string.list_empty)
            setDesc(getString(R.string.list_empty_desc))
            setButton(getString(R.string.list_empty_action), View.OnClickListener {
                // 刷新
                onRefresh()
            })
        }
        loadingView?.visibility = View.VISIBLE
        // 重置
        pageIndex = 1
    }

    /**
     * 完成刷新后调用
     */
    fun finishRefresh(dataItems: List<HiDataItem<*, out RecyclerView.ViewHolder>>?) {
        val success = dataItems != null && dataItems.isNotEmpty()

        // 单这样的判单还不够；可能出现下拉的时候，又执行了上拉分页；需要添加别的措施
        val refresh = pageIndex == 1
        // 判断是在第一页
        if (refresh) {
            // 无论刷新失败/成功
            loadingView?.visibility = View.GONE
            // 刷新结束
            refreshLayout?.refreshFinished()

            // 如果刷新成功
            if (success) {
                emptyView?.visibility = View.GONE
                // 把前面的数据抹掉
                hiAdapter.clearItems()
                hiAdapter.addItems(dataItems!!, true)
            } else {
                // 刷新失败，需要判断列表上是不是又数据
                if (hiAdapter.itemCount <= 0) {
                    emptyView?.visibility = View.VISIBLE
                }
            }
        } else {
            // 分页显示
            if (success) {
                hiAdapter.addItems(dataItems!!, true)
            }
            recyclerView?.loadFinished(success)
        }


    }

    open fun createLayoutManager(): RecyclerView.LayoutManager =
        LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)

    override fun enableRefresh(): Boolean = true

    /**
     * 是否支持加载更多，添加接口回调
     */
    open fun enableLoadMore(callback: () -> Unit) {

        recyclerView?.enableLoadingMore({
            if (refreshHeaderView.state == HiOverView.HirefreshState.STATE_REFRESH) {
                // 正在刷新状态
                recyclerView?.loadFinished(false)
                return@enableLoadingMore
            }
            pageIndex++
            // 调用回调方法
            callback()
        }, PREFETCH_SIZE)
    }

    /**
     * 不允许加载更多
     */
    fun disableLoadMore() {
        recyclerView?.disableLoadMore()
    }

    // Denotes that any overriding methods should invoke this method as well.
    // 无论是否重写该方法，都必须调用该方法
    @CallSuper
    override fun onRefresh() {
        if (recyclerView?.isLoading() == true) {
            //正处于分页，这时不能取刷新
            //复现场景,比较难以复现---》如果下执行上拉分页。。。快速返回  往下拉，松手。会出现一个bug: 转圈圈的停住不动了。
            //问题的原因在于 立刻调用 refreshFinished 时，refreshHeader的底部bottom值是超过了 它的height的。
            //refreshLayout#recover（dis） 方法中判定了，如果传递dis 参数 大于 header height ,dis =200,height =100,只能恢复到 刷新的位置。不能恢复到初始位置。
            //加了延迟之后，他会  等待 松手的动画做完，才去recover 。此时就能恢复最初状态了。
            refreshLayout?.post {
                refreshLayout?.refreshFinished()
            }
            return
        }
        pageIndex = 1
    }
}